// pages/dish-edit/dish-edit.js
const kitchenService = require('../../services/kitchenService');

Page({
  /**
   * 页面的初始数据
   */
  data: {
    mode: 'create', // create 或 edit
    kitchenId: null,
    dishId: null,
    loading: false,
    dish: {
      _id: null,
      name: '',
      description: '',
      image: '/imgs/chef-hat.svg',
      tags: [],
      price: '',
      calories: '',
      cookingTime: '',
      difficulty: '简单',
      nutrition: {
        protein: '',
        fat: '',
        carbs: '',
        fiber: ''
      }
    },
    inputTag: '',
    tagList: ['家常菜', '快手菜', '素食', '肉食', '早餐', '午餐', '晚餐', '小吃', '甜点', '汤品', '主食', '海鲜']
  },

  /**
   * 生命周期函数--监听页面加载
   */
  async onLoad(options) {
    console.log('菜品编辑页面参数:', options);
    const { kitchenId, dishId, mode } = options;
    
    if (!kitchenId) {
      wx.showToast({
        title: '参数错误',
        icon: 'none'
      });
      setTimeout(() => {
        wx.navigateBack();
      }, 1500);
      return;
    }
    
    this.setData({
      kitchenId,
      mode: mode || 'create',
      loading: true,
      'dish._id': dishId || null  // 确保将dishId正确设置到dish对象中
    });
    
    // 设置导航栏标题
    wx.setNavigationBarTitle({
      title: mode === 'create' ? '添加菜品' : '编辑菜品'
    });
    
    if (dishId && mode === 'edit') {
      // 获取菜品详情
      try {
        console.log('正在获取菜品详情:', kitchenId, dishId);
        
        // 加载菜品前加一个短暂延迟，确保页面已经完全加载
        await new Promise(resolve => setTimeout(resolve, 300));
        
        const dish = await kitchenService.getDishById(kitchenId, dishId);
        console.log('获取到菜品详情:', dish);
        
        if (dish) {
          // 确保价格字段是字符串，便于表单处理
          const price = dish.price !== undefined ? dish.price.toString() : '';
          // 确保标签数组存在
          const tags = Array.isArray(dish.tags) ? dish.tags : [];
          
          this.setData({
            dish: {
              ...dish,
              price,
              tags
            },
            loading: false
          });
        } else {
          console.error('菜品不存在');
          wx.showToast({
            title: '菜品不存在',
            icon: 'none'
          });
          setTimeout(() => {
            wx.navigateBack();
          }, 1500);
        }
      } catch (error) {
        console.error('获取菜品详情失败:', error);
        this.setData({ loading: false });
        wx.showToast({
          title: '加载失败',
          icon: 'none'
        });
      }
    } else {
      this.setData({ loading: false });
    }
  },
  
  /**
   * 输入框内容变化处理
   */
  handleInputChange(e) {
    const { field } = e.currentTarget.dataset;
    const { value } = e.detail;
    
    this.setData({
      [`dish.${field}`]: value
    });
  },
  
  /**
   * 价格输入处理（只允许数字和小数点）
   */
  handlePriceInput(e) {
    const value = e.detail.value;
    // 只允许数字和一个小数点
    const regex = /^\d*\.?\d{0,2}$/;
    if (regex.test(value) || value === '') {
      this.setData({
        'dish.price': value
      });
    }
    return this.data.dish.price;
  },
  
  /**
   * 处理标签输入
   */
  handleTagInput(e) {
    this.setData({
      inputTag: e.detail.value
    });
  },
  
  /**
   * 添加自定义标签
   */
  addCustomTag() {
    const { inputTag, dish } = this.data;
    if (!inputTag.trim()) return;
    
    if (!dish.tags.includes(inputTag)) {
      this.setData({
        'dish.tags': [...dish.tags, inputTag],
        inputTag: ''
      });
    } else {
      wx.showToast({
        title: '标签已存在',
        icon: 'none'
      });
    }
  },
  
  /**
   * 添加预设标签
   */
  addTag(e) {
    const { tag } = e.currentTarget.dataset;
    const { dish } = this.data;
    
    if (!dish.tags.includes(tag)) {
      this.setData({
        'dish.tags': [...dish.tags, tag]
      });
    } else {
      wx.showToast({
        title: '标签已存在',
        icon: 'none'
      });
    }
  },
  
  /**
   * 移除标签
   */
  removeTag(e) {
    const { index } = e.currentTarget.dataset;
    const { dish } = this.data;
    const newTags = [...dish.tags];
    newTags.splice(index, 1);
    
    this.setData({
      'dish.tags': newTags
    });
  },
  
  /**
   * 选择图片
   */
  chooseImage() {
    wx.chooseMedia({
      count: 1, 
      mediaType: ['image'],
      sizeType: ['compressed'],
      sourceType: ['album', 'camera'],
      success: (res) => {
        const tempFilePath = res.tempFiles[0].tempFilePath;
        this.setData({
          'dish.image': tempFilePath
        });
        
        // 上传图片到云存储
        this.uploadImage(tempFilePath);
      }
    });
  },
  
  /**
   * 上传图片到云存储
   */
  async uploadImage(filePath) {
    wx.showLoading({
      title: '上传中...',
      mask: true
    });
    
    try {
      const timestamp = new Date().getTime();
      const cloudPath = `dishes/${timestamp}.jpg`;
      
      const uploadResult = await wx.cloud.uploadFile({
        cloudPath: cloudPath,
        filePath: filePath
      });
      
      console.log('图片上传成功:', uploadResult);
      
      this.setData({
        'dish.image': uploadResult.fileID
      });
      
      wx.hideLoading();
      wx.showToast({
        title: '图片上传成功',
        icon: 'success'
      });
    } catch (error) {
      console.error('上传图片失败', error);
      wx.hideLoading();
      wx.showToast({
        title: '图片上传失败',
        icon: 'none'
      });
    }
  },
  
  /**
   * 设置制作难度
   */
  setDifficulty(e) {
    const level = e.currentTarget.dataset.level;
    this.setData({
      'dish.difficulty': level
    });
  },

  /**
   * 处理营养成分输入
   */
  handleNutritionInput(e) {
    const { field } = e.currentTarget.dataset;
    const { value } = e.detail;
    
    // 只允许数字和小数点
    const regex = /^\d*\.?\d{0,2}$/;
    if (regex.test(value) || value === '') {
      this.setData({
        [`dish.nutrition.${field}`]: value
      });
    }
    return this.data.dish.nutrition[field];
  },
  
  /**
   * 保存菜品
   */
  async saveDish() {
    const { dish, kitchenId, mode } = this.data;
    
    // 表单验证
    if (!dish.name.trim()) {
      wx.showToast({
        title: '请输入菜品名称',
        icon: 'none'
      });
      return;
    }
    
    // 显示加载中
    wx.showLoading({
      title: '保存中...',
      mask: true
    });
    
    try {
      // 准备菜品数据，排除系统字段
      const { _id, _openid, ...baseData } = dish;
      
      const dishData = {
        ...baseData,
        // 将价格转换为数字类型
        price: dish.price ? parseFloat(dish.price) : 0,
        // 确保tags是数组
        tags: Array.isArray(dish.tags) ? dish.tags : [],
        // 处理制作信息
        calories: dish.calories ? parseInt(dish.calories) : 0,
        cookingTime: dish.cookingTime ? parseInt(dish.cookingTime) : 0,
        difficulty: dish.difficulty || '简单',
        // 处理营养成分
        nutrition: {
          protein: dish.nutrition.protein ? parseFloat(dish.nutrition.protein) : 0,
          fat: dish.nutrition.fat ? parseFloat(dish.nutrition.fat) : 0,
          carbs: dish.nutrition.carbs ? parseFloat(dish.nutrition.carbs) : 0,
          fiber: dish.nutrition.fiber ? parseFloat(dish.nutrition.fiber) : 0
        }
      };
      
      // 编辑模式下传递ID，但不作为更新数据的一部分
      const saveData = mode === 'edit' ? { id: dish._id, data: dishData } : dishData;
      
      console.log('准备保存菜品数据:', saveData, '厨房ID:', kitchenId);
      
      // 保存菜品
      const success = await kitchenService.saveDish(kitchenId, saveData);
      
      wx.hideLoading();
      
      if (success) {
        console.log('菜品保存成功');
        wx.showToast({
          title: mode === 'create' ? '添加成功' : '更新成功',
          icon: 'success',
          duration: 1500,
          success: () => {
            setTimeout(() => {
              try {
                // 通知前一页刷新
                const eventChannel = this.getOpenerEventChannel();
                if (eventChannel && eventChannel.emit) {
                  eventChannel.emit('dishUpdated', { success: true });
                }
              } catch (err) {
                console.error('发送事件通知失败:', err);
              }
              wx.navigateBack();
            }, 1500);
          }
        });
      } else {
        console.error('菜品保存失败');
        wx.showToast({
          title: '保存失败',
          icon: 'none'
        });
      }
    } catch (error) {
      console.error('保存菜品错误:', error);
      wx.hideLoading();
      wx.showToast({
        title: '保存失败',
        icon: 'none'
      });
    }
  },
  
  /**
   * 删除菜品
   */
  async deleteDish() {
    const { kitchenId, dish } = this.data;
    
    if (!kitchenId || !dish._id) {
      wx.showToast({
        title: '无法删除，参数错误',
        icon: 'none'
      });
      return;
    }
    
    wx.showModal({
      title: '确认删除',
      content: '确定要删除这个菜品吗？此操作不可恢复。',
      success: async (res) => {
        if (res.confirm) {
          wx.showLoading({
            title: '删除中...',
            mask: true
          });
          
          try {
            console.log('准备删除菜品:', kitchenId, dish._id);
            const success = await kitchenService.deleteDish(kitchenId, dish._id);
            wx.hideLoading();
            
            if (success) {
              console.log('菜品删除成功');
              wx.showToast({
                title: '删除成功',
                icon: 'success',
                duration: 1500,
                success: () => {
                  setTimeout(() => {
                    try {
                      // 通知前一页刷新
                      const eventChannel = this.getOpenerEventChannel();
                      if (eventChannel && eventChannel.emit) {
                        eventChannel.emit('dishUpdated', { success: true, deleted: true });
                      }
                    } catch (err) {
                      console.error('发送删除事件通知失败:', err);
                    }
                    wx.navigateBack();
                  }, 1500);
                }
              });
            } else {
              console.error('菜品删除失败');
              wx.showToast({
                title: '删除失败',
                icon: 'none'
              });
            }
          } catch (error) {
            console.error('删除菜品错误:', error);
            wx.hideLoading();
            wx.showToast({
              title: '删除失败',
              icon: 'none'
            });
          }
        }
      }
    });
  },
  
  /**
   * 取消
   */
  cancel() {
    wx.navigateBack();
  }
}) 